const HtmlWebpackPlugin = require("html-webpack-plugin");
const JavaScriptObfuscator = require('webpack-obfuscator');
const path = require("path");

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
const TerserPlugin = require('terser-webpack-plugin');
// 代码混淆插件
module.exports = {
    output: {
        filename: "tac.min.js",
        path: path.resolve(__dirname, "./dist")
    },
    externals: {
        // jquery: 'jQuery'
    },
    optimization: {
        minimize: true,
        minimizer: [new TerserPlugin({
            terserOptions: {
                compress: {
                    drop_console: true, // 移除所有的`console`语句
                },
                output: {
                    comments: false, // 去掉注释
                },
            },
            extractComments: false, // 是否将注释提取到单独的文件中
        })],
    },
    plugins: [

        new HtmlWebpackPlugin({
            filename: 'index.html',
            template: './public/index-prod.html'
        }),
        new JavaScriptObfuscator({
            // 压缩代码
            compact: true,
            // 是否启用控制流扁平化(降低1.5倍的运行速度)
            controlFlowFlattening: true,
            controlFlowFlatteningThreshold: 0.5,
            // 随机的死代码块(增加了混淆代码的大小)
            deadCodeInjection: true,
            // 标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
            identifierNamesGenerator: 'mangled',
            log: false,
            // 是否启用全局变量和函数名称的混淆
            renameGlobals: true,
            // 通过固定和随机（在代码混淆时生成）的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小，建议使用此选项，因为辅助函数可以引起注意。
            rotateStringArray: true,
            // 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
            selfDefending: true,
            cpmpat: true,
            // 删除字符串文字并将它们放在一个特殊的数组中
            stringArray: true,
            stringArrayThreshold: 0.75,
            // 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小，并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
            unicodeEscapeSequence: false
            // 数组内是需要排除的文件
        }, []),
        // new BundleAnalyzerPlugin(),  // 使用默认配置
    ]

}
